// // // //------------------------------------- Георги код (Interface + type aliases)------------------------------------------------------
// interface Person {
//   name: string;
//   age: number;
// }

// //1.interface inheritance
// interface IEmployee extends Person {
//   empCode: number;
// }

// let empObj: IEmployee = {
//   empCode: 1,
//   name: "Georgi",
//   age: 21,
// };

// //print
// console.log(empObj);

// //2.interface as function type
// interface KeyValueProcessor {
//   (key: number, value: string): void;
// }

// function addKeyValue(key: number, value: string): void {
//   console.log("addKeyValue: key = " + key + ", value = " + value);
// }

// let testerObject: KeyValueProcessor = addKeyValue;
// testerObject(1, "Georgi"); //Output: addKeyValue: key = 1, value = Georgi

// //trying to assign a function with a different signature leads to compile error
// // function delete(key:number):void {
// //     console.log('Key deleted.')
// // }

// // let kvp: KeyValueProcessor = delete; //Compile Error

// //3.interface in class
// class Employee implements IEmployee {
//   empCode: number;
//   name: string;
//   age: number;
//   constructor(code: number, name: string, age: number) {
//     this.empCode = code;
//     this.name = name;
//     this.age = age;
//   }
// }

// let emp = new Employee(1, "Ivan", 21);
// //print
// console.log(emp);

// //4.array type interface
// interface NumList {
//   [index: number]: number;
// }

// let numArr: NumList = [1, 2, 3];

// interface IStringList {
//   [index: string]: string;
// }

// let strArr: IStringList = {};
// strArr["TS"] = "TypeScript";
// strArr["JS"] = "JavaScript";

// //print
// console.log(numArr);
// console.log(strArr);

// //1.type aliases
// type ISBN = number | string; //union type

// let variable: ISBN;
// variable = 1;
// console.log(variable);

// //can define object type as well
// type Publication = {
//   isbn: ISBN;
//   author: string;
//   publisher: string;
// };

// //2.extend type aliases via intersections
// type Animal = {
//   name: string;
// };

// type Bear = Animal & {
//   honey: boolean;
// };

// function getBear(): Bear {
//   return {
//     name: "Yogi",
//     honey: true,
//   };
// }

// const bear = getBear();
// console.log(bear.name); // Output: "Yogi"
// console.log(bear.honey); // Output: true

// //3.type aliases as Generics
// type Result<T> = T | { value: T };

// let value: Result<string> = "hello"; //one way
// let other: Result<string> = { value: "world" }; //alternative

// //print
// console.log(value);
// console.log(other);

// // //------------------ТОШКО--------------------------------------------------------------------
// interface Person {
//   firstName: string;
//   surname: string;
// }

// type PersonProperties = keyof Person;
// // type PersonProperties = 'firstName' | 'surname';

// type Arrayish = { [n: number]: unknown };
// type A = keyof Arrayish;
// // type A = number

// // use case

// let person: Person = {
//   firstName: "Ivan",
//   surname: "Ivanov",
// };

// function changeName(
//   person: Person,
//   personEntry: keyof Person, // 'firstName' | 'surname'
//   change: string
// ) {
//   person[personEntry] = change;
// }

// changeName(person, "firstName", "Gogo");

// // in typeof

// type Optional<T> = {
//   [K in keyof T]?: T[K];
// };

// const personTest: Optional<Person> = {
//   firstName: "Tobias",
// };

// // // //----------------------БОЖИДАРА-------------------------------------------------------------------------
// interface Person {
//   name: string;
//   age?: number; // Oпционално свойство
// }

// const person1: Person = { name: "Ivan" }; // Това е валидно, тъй като възрастта е опционална
// const person2: Person = { name: "Georgi", age: 30 }; // Също е валидно

// console.log(person1);
// console.log(person2);

// interface Author {
//   name: string;
//   socialMedia?: {
//     twitter?: string;
//     linkedIn?: string;
//   };
// }

// const author: Author = {
//   name: "Ivan Petrov",
//   socialMedia: {
//     twitter: "@ivanP",
//   },
// };

// const twitterProfile = author.socialMedia?.twitter; // Това връща "@ivanP"
// const linkedInProfile = author.socialMedia?.linkedIn; // Това връща undefined, тъй като свойството linkedIn не е определено

// console.log(twitterProfile);
// console.log(linkedInProfile);

// const result = someObject?.someMethod?.();
// const item = someArray?.[index];

//-----------------------------МАРИЯ-------------------------------------------------------------------------------

// //Literal types
// let myName: "Maria" | "Elena";
// myName = "Maria";
// // myName = "Eli";// error
// console.log(myName);

// function getAge(age: 1 | 10 | 17 | 50) {
//   if (age == 1) {
//     console.log("baby");
//   } else if (age == 10) {
//     console.log("child");
//   } else if (age == 17) {
//     console.log("teenager");
//   } else if (age == 50) {
//     console.log("adult");
//   }
// }

// getAge(10);
// // getAge(36); // error

// // const / as const
// const z = [10, 20];
// // z = [2, 3];// error
// z.push(30);
// console.log(z);

// let a = [4, 6] as const;
// // a.push(3);// error

// //null undefined
// let temp;
// console.log(typeof temp); //undefined

// temp = null;
// console.log(typeof temp); //object
// temp = 5;
// console.log(temp);
// console.log(typeof temp); //number

// // //void
// let s: void;
// s = undefined; //ok
// // s=null   //error
// // s="test" //error
// // s=4 //error
// console.log(typeof s);

// let q:undefined;
// let b:void;

// b = q;        //може да се присвои undefined на void
// q = b;        //не може да присвоим void на undefined

// // // non-null assertion  !
// let myString: string | undefined;

// console.log(myString.length); // 'myString' (object) is possibly 'undefined'
// console.log(myString!.length); // No error
